{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 机器学习练习 5 - 偏差和方差"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "本章代码涵盖了基于Python的解决方案，用于Coursera机器学习课程的第五个编程练习。 请参考[练习文本](ex5.pdf)了解详细的说明和公式。\n",
    "\n",
    "代码修改并注释：黄海广，haiguang2000@qq.com"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import scipy.io as sio\n",
    "import scipy.optimize as opt\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def load_data():\n",
    "    \"\"\"for ex5\n",
    "    d['X'] shape = (12, 1)\n",
    "    pandas has trouble taking this 2d ndarray to construct a dataframe, so I ravel\n",
    "    the results\n",
    "    \"\"\"\n",
    "    d = sio.loadmat('ex5data1.mat')\n",
    "    return map(np.ravel, [d['X'], d['y'], d['Xval'], d['yval'], d['Xtest'], d['ytest']])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X, y, Xval, yval, Xtest, ytest = load_data()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nC0QAStTjgr2nWyB292A7swBQrh4X7J56C0RnFgDK1uMuOuupt0D04QoAZetxwe6pt0DsqWcWALqL\nHndKvKfeArF5QO+8uvY3o93dzywAdBc9LthJz7wF4ohhg97yM+xf3U7HcFEfUE89Mtg9UU89s1CV\nrnBRn28YoHsT7B6kJ55ZqEpn/7pgV/iGAaivHnfRGdRDZ1/U57cAoPsTbOgAnf3rgp39DQNQf4IN\nHaCzf12ws79hAOpPsKEDDB08MB8fdWQOPrB39mloyMEH9s7HRx1Z2c+PO/sbBqD+XHQGHaQzL+rz\nWwDQ/Qk2dBN+CwC6N6fEAaAAgg0ABXBKnA7njlsAHU+w6VDuuAVQH06J06HccQugPgSbDuWOWwD1\nIdh0KHfcAqgPwaZDueMWQH246IwO5Y5bAPUh2HQ4d9wC6HhOiQNAAQQbAAog2ABQAMEGgAIINgAU\nQLABoACV/lpXa2trZs2alWeffTb77rtv5syZk8MPP7zKEQCgSJUeYf/rv/5rtm3blm9961u5+uqr\n8/nPf77K3QNAsSoN9hNPPJGTTjopSXLcccdlxYoVVe4eAIpV6SnxjRs3pm/fvm2PGxsbs2PHjjQ1\n/fYxDjzwgDQ1NVY1XpfS3Nyvs0focax59ax59ax59TpqzSsNdt++fbNp06a2x62trbuNdZKsXftG\nFWN1Oc3N/dLSsqGzx+hRrHn1rHn1rHn19nbN9xT3Sk+JH3/88Vm8eHGS5KmnnsoHPvCBKncPAMWq\n9Ah79OjR+dGPfpTzzz8/tVotc+fOrXL3AFCsSoO9zz775LOf/WyVuwSAbsGNUwCgAIINAAVoqNVq\ntc4eAgDYM0fYAFAAwQaAAgg2ABRAsAGgAIINAAUQbAAogGB3Mc8//3z+6I/+KFu3bk2y657r5557\nbs4///z8/d//fSdP171s2LAhn/70p/Onf/qnGT9+fJ588skk1rzeWltbc+ONN2b8+PGZNGlSXnrp\npc4eqVvavn17pk6dmokTJ2bcuHFZtGhRXnrppUyYMCETJ07MzJkz09ra2tljdktr1qzJqFGj8vzz\nz3fsmtfoMjZs2FC7+OKLayeeeGJty5YttVqtVjvzzDNrL730Uq21tbX2yU9+srZy5cpOnrL7uPXW\nW2tf/epXa7Varfb888/Xzj777FqtZs3r7Yc//GFt2rRptVqtVnvyySdrn/70pzt5ou7pO9/5Tm3O\nnDm1Wq1WW7t2bW3UqFG1Sy65pPbYY4/VarVa7YYbbqj9y7/8S2eO2C1t27at9hd/8Re10047rfbc\nc8916Jo7wu4iarVabrjhhlx11VXp3bt3kl2fH75t27YcdthhaWhoyIgRI7JkyZJOnrT7+PM///Oc\nf/75SZKdO3dmv/32s+YVeOKJJ3LSSSclSY477risWLGikyfqnk4//fRceeWVSXb9+9LY2JiVK1dm\n+PDhSZKRI0f6u10H8+bNy/nnn5/f+73fS5IOXfNKP/yDXf7pn/4pX//619+y7T3veU/OOOOMfPCD\nH2zbtnHjxvTt27ftcZ8+ffLyyy9XNmd38tvWfO7cuRk2bFhaWloyderUTJ8+3ZpX4NfXuLGxMTt2\n7EhTk3+OOlKfPn2S7FrvK664IlOmTMm8efPS0NDQ9vyGDT4buyPde++9efe7352TTjop//AP/5Bk\n1zdLHbXmvkI6wbnnnptzzz33LdtGjx6dhQsXZuHChWlpacnkyZNz1113ZdOmTW1/ZtOmTenfv3/V\n43YLv23Nk+TZZ5/NVVddlWuvvTbDhw/Pxo0brXmd9e3b9y1r3NraKtZ1snr16lx22WWZOHFixo4d\nm5tvvrntOX+3O97ChQvT0NCQpUuX5plnnsm0adPy+uuvtz3/u665U+JdxEMPPZQFCxZkwYIFaW5u\nzle+8pX07ds3vXr1yn//93+nVqvl0UcfzQknnNDZo3Ybzz33XK688srccsstGTVqVJJY8wocf/zx\nWbx4cZJdF/h94AMf6OSJuqfXXnstkydPztSpUzNu3LgkyTHHHJNly5YlSRYvXuzvdge7++67841v\nfCMLFizIH/zBH2TevHkZOXJkh625D//ogj7ykY/kgQceyH777Zennnoqc+fOzc6dOzNixIj81V/9\nVWeP121ceumlefbZZ3PIIYck2RXr+fPnW/M6a21tzaxZs/Kzn/0stVotc+fOzVFHHdXZY3U7c+bM\nyQMPPJAjjzyybdtf//VfZ86cOdm+fXuOPPLIzJkzJ42NjZ04Zfc1adKkzJo1K/vss09uuOGGDllz\nwQaAAjglDgAFEGwAKIBgA0ABBBsACiDYAFAAwYZubNKkSR32XkcffXSHvVeya7Zf/n4q0D7Bhm7s\n3//93zt7BKCDCDYUYOzYsXn++eeTJFdffXVmzpyZZNedwi6++OLMmDEj48ePzymnnJJPfvKT2bJl\nS+bMmZMkbbdkXbx4ccaNG5ezzz47l19+edauXZtk1416pkyZkjFjxmTNmjXtzrJp06ZMmzYtH/vY\nx3LWWWfl+9//fpLknHPOyX/+538m2fVhKiNHjsyaNWuyfPnyTJgwIeecc04mT57s3uzwDgk2FGDU\nqFFZunRpkuRnP/tZ/uM//iPJrggfe+yx6dWrV771rW/loYceytatW/PII49kxowZSXZ98Mnrr7+e\nW265JV/+8pdz3333ZcSIEfnbv/3btvcfOXJkfvjDH2bgwIHtzjJ//vwMGTIk9957b+6+++7ceeed\nefnll3PWWWflBz/4QZLksccey9FHH51+/fplxowZueWWW/Ld7343F110UW644YaOXh7oEdxxHwpw\n8skn56tf/WpOPPHEvO9978sLL7yQNWvWZPHixbntttuyadOm3H333XnhhRfy4osv5o033njL659+\n+umsXr06F154YZJdtwd917ve1fb8scce+7ZnWbJkSbZs2ZKFCxcmSd54443813/9V/74j/84559/\nfq699tp8//vfz5lnnpkXX3wxL7/8ci699NK212/cuPF3WQrosQQbCvCHf/iHufbaa7NkyZIMHz48\nAwcOzIMPPpjt27fnmWeeyW233ZYLL7wwH/vYx7J27dr8+h2Hd+7cmeOPPz533nlnkmTr1q1v+cSs\n/fbb723P0tramptvvjlDhgxJsutDJt71rnelV69eOeKII7Js2bIsXbo0N954Y1566aUceuih+d73\nvtc2x2uvvfa7Lgf0SE6JQwEaGxtz7LHHZsGCBRk+fHhOPPHE3HnnnW2nyj/60Y/m4x//eA466KA8\n/vjj2blzZ9vrduzYkWOPPTZPPfVUVq1alSS544478jd/8zfvaJYTTzwx//iP/5gk+Z//+Z+ceeaZ\nWb16dZLkrLPOyrx58zJ8+PD07t07Rx55ZP73f/83P/7xj5Ps+vjBa6655nddDuiRHGFDIUaNGpXH\nH388Rx11VJqbm7NmzZqcfPLJ6dOnT6655po8+OCD2XfffXPcccfllVdeSZKccsopOeuss3Lvvfdm\n7ty5mTJlSlpbW3PwwQe/5bOR98bll1+eWbNm5U/+5E+yc+fOTJ06NYcddliSXZ/rPnPmzFx99dVJ\nkn333Te33nprPve5z2Xr1q3p27dv5s2b1zELAj2MT+sCgAI4wgaSJFu2bMn48eN/63NXXHFFTjnl\nlIonAn6VI2wAKICLzgCgAIINAAUQbAAogGADQAEEGwAKINgAUID/Az1OW9w52vN+AAAAAElFTkSu\nQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xb896898>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df = pd.DataFrame({'water_level':X, 'flow':y})\n",
    "\n",
    "sns.lmplot('water_level', 'flow', data=df, fit_reg=False, size=7)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X, Xval, Xtest = [np.insert(x.reshape(x.shape[0], 1), 0, np.ones(x.shape[0]), axis=1) for x in (X, Xval, Xtest)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 代价函数\n",
    "<img style=\"float: left;\" src=\"../img/linear_cost.png\">"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def cost(theta, X, y):\n",
    "    \"\"\"\n",
    "    X: R(m*n), m records, n features\n",
    "    y: R(m)\n",
    "    theta : R(n), linear regression parameters\n",
    "    \"\"\"\n",
    "    m = X.shape[0]\n",
    "\n",
    "    inner = X @ theta - y  # R(m*1)\n",
    "\n",
    "    # 1*m @ m*1 = 1*1 in matrix multiplication\n",
    "    # but you know numpy didn't do transpose in 1d array, so here is just a\n",
    "    # vector inner product to itselves\n",
    "    square_sum = inner.T @ inner\n",
    "    cost = square_sum / (2 * m)\n",
    "\n",
    "    return cost"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "303.95152555359761"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "theta = np.ones(X.shape[1])\n",
    "cost(theta, X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 梯度\n",
    "<img style=\"float: left;\" src=\"../img/linear_gradient.png\">"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def gradient(theta, X, y):\n",
    "    m = X.shape[0]\n",
    "\n",
    "    inner = X.T @ (X @ theta - y)  # (m,n).T @ (m, 1) -> (n, 1)\n",
    "\n",
    "    return inner / m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ -15.30301567,  598.16741084])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gradient(theta, X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 正则化梯度\n",
    "<img style=\"float: left;\" src=\"../img/linear_reg_gradient.png\">"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def regularized_gradient(theta, X, y, l=1):\n",
    "    m = X.shape[0]\n",
    "\n",
    "    regularized_term = theta.copy()  # same shape as theta\n",
    "    regularized_term[0] = 0  # don't regularize intercept theta\n",
    "\n",
    "    regularized_term = (l / m) * regularized_term\n",
    "\n",
    "    return gradient(theta, X, y) + regularized_term"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ -15.30301567,  598.25074417])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "regularized_gradient(theta, X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 拟合数据\n",
    "> 正则化项 $\\lambda=0$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def linear_regression_np(X, y, l=1):\n",
    "    \"\"\"linear regression\n",
    "    args:\n",
    "        X: feature matrix, (m, n+1) # with incercept x0=1\n",
    "        y: target vector, (m, )\n",
    "        l: lambda constant for regularization\n",
    "\n",
    "    return: trained parameters\n",
    "    \"\"\"\n",
    "    # init theta\n",
    "    theta = np.ones(X.shape[1])\n",
    "\n",
    "    # train it\n",
    "    res = opt.minimize(fun=regularized_cost,\n",
    "                       x0=theta,\n",
    "                       args=(X, y, l),\n",
    "                       method='TNC',\n",
    "                       jac=regularized_gradient,\n",
    "                       options={'disp': True})\n",
    "    return res\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def regularized_cost(theta, X, y, l=1):\n",
    "    m = X.shape[0]\n",
    "\n",
    "    regularized_term = (l / (2 * m)) * np.power(theta[1:], 2).sum()\n",
    "\n",
    "    return cost(theta, X, y) + regularized_term"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "theta = np.ones(X.shape[0])\n",
    "\n",
    "final_theta = linear_regression_np(X, y, l=0).get('x')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nPHiw0blzZ+Po0aOGYRjG1VdfbezcudPweDzG3XffbWzevNnmlMHnmWeeMV555RXDMAxj+/btxrXX\nXmsYBmtvhX//+9/G2LFjDcMwjIyMDGPo0KE2Jwpuf/vb34zU1FTDMAwjJyfHSElJMe655x5j7dq1\nhmEYxsSJE43//Oc/dkYMakVFRca9995r9O3b18jMzKzy2vPJtxoYhqGJEyfqoYceUq1atSRJBQUF\nKioqUqNGjeRwONS1a1d9+eWXNicNPnfeeacGDBggSSotLZXL5WLtLbJhwwZ169ZNktS2bVtt2rTJ\n5kTB7bLLLtODDz4o6di/OWFhYdq8ebM6duwoSerevTt/z31o+vTpGjBggOrXry9JVV778GpPGOTe\neecdLV682Gt29tln64orrlCLFi3KZgUFBYqKiiq7HRkZqV9++cWynMGovLWfNm2a2rRpo6ysLI0e\nPVrjx49n7S3yx3UOCwtTSUmJwsP5Z8UXIiMjJR1b9wceeEAjRozQ9OnT5XA4yu7Pz8+3M2LQeu+9\n91S3bl1169ZNixYtknTsDVBV1p7fktN000036aabbvKa9enTR++++67effddZWVladCgQVq4cKEK\nCwvLfqawsFAxMTFWxw0q5a29JG3dulUPPfSQxowZo44dO6qgoIC1t0BUVJTXOns8HorXx3799VcN\nHz5cAwcO1FVXXaWZM2eW3cffc99599135XA4tGbNGm3ZskVjx47VwYMHy+6vzNqz2bkafPrpp1qy\nZImWLFmi+Ph4vfzyy4qKilJERIR27dolwzC0atUqdejQwe6oQSczM1MPPvigZs2apZSUFEli7S3S\nrl07paWlSTp2gFtSUpLNiYJbdna2Bg0apNGjR+vGG2+UJLVq1Urp6emSpLS0NP6e+8gbb7yh119/\nXUuWLFHLli01ffp0de/evUprz4UVqlmvXr308ccfy+VyaePGjZo2bZpKS0vVtWtXjRw50u54QWfY\nsGHaunWrGjZsKOlY8c6fP5+1t4DH49GUKVO0bds2GYahadOmqWnTpnbHClqpqan6+OOPlZCQUDab\nMGGCUlNTVVxcrISEBKWmpiosLMzGlMHv9ttv15QpU+R0OjVx4sRKrz3lCwCAxdjsDACAxShfAAAs\nRvkCAGAxyhcAAItRvgAAWIzyBQDAYpQvAAAWo3wBALDY/wOiomqtWcNuVAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xb8894e0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "b = final_theta[0] # intercept\n",
    "m = final_theta[1] # slope\n",
    "\n",
    "plt.scatter(X[:,1], y, label=\"Training data\")\n",
    "plt.plot(X[:, 1], X[:, 1]*m + b, label=\"Prediction\")\n",
    "plt.legend(loc=2)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "training_cost, cv_cost = [], []"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1.使用训练集的子集来拟合应模型\n",
    "\n",
    "2.在计算训练代价和交叉验证代价时，没有用正则化\n",
    "\n",
    "3.记住使用相同的训练集子集来计算训练代价"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "m = X.shape[0]\n",
    "for i in range(1, m+1):\n",
    "#     print('i={}'.format(i))\n",
    "    res = linear_regression_np(X[:i, :], y[:i], l=0)\n",
    "    \n",
    "    tc = regularized_cost(res.x, X[:i, :], y[:i], l=0)\n",
    "    cv = regularized_cost(res.x, Xval, yval, l=0)\n",
    "#     print('tc={}, cv={}'.format(tc, cv))\n",
    "    \n",
    "    training_cost.append(tc)\n",
    "    cv_cost.append(cv)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xb9faa20>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(np.arange(1, m+1), training_cost, label='training cost')\n",
    "plt.plot(np.arange(1, m+1), cv_cost, label='cv cost')\n",
    "plt.legend(loc=1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这个模型拟合不太好, **欠拟合了**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 创建多项式特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def prepare_poly_data(*args, power):\n",
    "    \"\"\"\n",
    "    args: keep feeding in X, Xval, or Xtest\n",
    "        will return in the same order\n",
    "    \"\"\"\n",
    "    def prepare(x):\n",
    "        # expand feature\n",
    "        df = poly_features(x, power=power)\n",
    "\n",
    "        # normalization\n",
    "        ndarr = normalize_feature(df).as_matrix()\n",
    "\n",
    "        # add intercept term\n",
    "        return np.insert(ndarr, 0, np.ones(ndarr.shape[0]), axis=1)\n",
    "\n",
    "    return [prepare(x) for x in args]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def poly_features(x, power, as_ndarray=False):\n",
    "    data = {'f{}'.format(i): np.power(x, i) for i in range(1, power + 1)}\n",
    "    df = pd.DataFrame(data)\n",
    "\n",
    "    return df.as_matrix() if as_ndarray else df\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X, y, Xval, yval, Xtest, ytest = load_data()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>f1</th>\n",
       "      <th>f2</th>\n",
       "      <th>f3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-15.936758</td>\n",
       "      <td>253.980260</td>\n",
       "      <td>-4047.621971</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-29.152979</td>\n",
       "      <td>849.896197</td>\n",
       "      <td>-24777.006175</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>36.189549</td>\n",
       "      <td>1309.683430</td>\n",
       "      <td>47396.852168</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>37.492187</td>\n",
       "      <td>1405.664111</td>\n",
       "      <td>52701.422173</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-48.058829</td>\n",
       "      <td>2309.651088</td>\n",
       "      <td>-110999.127750</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>-8.941458</td>\n",
       "      <td>79.949670</td>\n",
       "      <td>-714.866612</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>15.307793</td>\n",
       "      <td>234.328523</td>\n",
       "      <td>3587.052500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>-34.706266</td>\n",
       "      <td>1204.524887</td>\n",
       "      <td>-41804.560890</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>1.389154</td>\n",
       "      <td>1.929750</td>\n",
       "      <td>2.680720</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>-44.383760</td>\n",
       "      <td>1969.918139</td>\n",
       "      <td>-87432.373590</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>7.013502</td>\n",
       "      <td>49.189211</td>\n",
       "      <td>344.988637</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>22.762749</td>\n",
       "      <td>518.142738</td>\n",
       "      <td>11794.353058</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           f1           f2             f3\n",
       "0  -15.936758   253.980260   -4047.621971\n",
       "1  -29.152979   849.896197  -24777.006175\n",
       "2   36.189549  1309.683430   47396.852168\n",
       "3   37.492187  1405.664111   52701.422173\n",
       "4  -48.058829  2309.651088 -110999.127750\n",
       "5   -8.941458    79.949670    -714.866612\n",
       "6   15.307793   234.328523    3587.052500\n",
       "7  -34.706266  1204.524887  -41804.560890\n",
       "8    1.389154     1.929750       2.680720\n",
       "9  -44.383760  1969.918139  -87432.373590\n",
       "10   7.013502    49.189211     344.988637\n",
       "11  22.762749   518.142738   11794.353058"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly_features(X, power=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 准备多项式回归数据\n",
    "1. 扩展特征到 8阶,或者你需要的阶数\n",
    "2. 使用 **归一化** 来合并 $x^n$ \n",
    "3. don't forget intercept term"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def normalize_feature(df):\n",
    "    \"\"\"Applies function along input axis(default 0) of DataFrame.\"\"\"\n",
    "    return df.apply(lambda column: (column - column.mean()) / column.std())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  1.00000000e+00,  -3.62140776e-01,  -7.55086688e-01,\n",
       "          1.82225876e-01,  -7.06189908e-01,   3.06617917e-01,\n",
       "         -5.90877673e-01,   3.44515797e-01,  -5.08481165e-01],\n",
       "       [  1.00000000e+00,  -8.03204845e-01,   1.25825266e-03,\n",
       "         -2.47936991e-01,  -3.27023420e-01,   9.33963187e-02,\n",
       "         -4.35817606e-01,   2.55416116e-01,  -4.48912493e-01],\n",
       "       [  1.00000000e+00,   1.37746700e+00,   5.84826715e-01,\n",
       "          1.24976856e+00,   2.45311974e-01,   9.78359696e-01,\n",
       "         -1.21556976e-02,   7.56568484e-01,  -1.70352114e-01]])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_poly, Xval_poly, Xtest_poly= prepare_poly_data(X, Xval, Xtest, power=8)\n",
    "X_poly[:3, :]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 画出学习曲线\n",
    "> 首先，我们没有使用正则化，所以 $\\lambda=0$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def plot_learning_curve(X, y, Xval, yval, l=0):\n",
    "    training_cost, cv_cost = [], []\n",
    "    m = X.shape[0]\n",
    "\n",
    "    for i in range(1, m + 1):\n",
    "        # regularization applies here for fitting parameters\n",
    "        res = linear_regression_np(X[:i, :], y[:i], l=l)\n",
    "\n",
    "        # remember, when you compute the cost here, you are computing\n",
    "        # non-regularized cost. Regularization is used to fit parameters only\n",
    "        tc = cost(res.x, X[:i, :], y[:i])\n",
    "        cv = cost(res.x, Xval, yval)\n",
    "\n",
    "        training_cost.append(tc)\n",
    "        cv_cost.append(cv)\n",
    "\n",
    "    plt.plot(np.arange(1, m + 1), training_cost, label='training cost')\n",
    "    plt.plot(np.arange(1, m + 1), cv_cost, label='cv cost')\n",
    "    plt.legend(loc=1)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nLLW1Wpe1N2qnvrFlOx3zpmec9s3y1G92BsYJ2x/d6UkBwqlef+o3yZSUOKqrm/r144QKtVHf+Lud\nUlLiTvucXwP53HPP5V//+hfXXnstGzduJC8vz5+771VMZNigHq8v3HEReNo7rS7D9tROfaN2Egle\nfg3kq666ivfff5/Zs2djmiY/+clP/Ll7ERGRoOXXQHY4HPzwhz/05y5FRERCgiYGERERsQEFsoiI\niA0okEVERGxAgSwiImIDCmQREREbUCCLiIjYgAJZRETEBhTIIiIiNqBAFhERsQHDNE17rcYgIiIS\ngnSGLCIiYgMKZBERERtQIIuIiNiAAllERMQGFMgiIiI2oEAWERGxAQXyAPF4PHzrW99izpw5zJo1\ni1WrVlldkm3V1tZyySWXUFxcbHUptvXUU09xww038PnPf54//elPVpdjSx6PhwcffJDZs2czZ84c\n/T6dwqZNm7j55psBKCsr48Ybb2TOnDnMnz8fn89ncXX2cWw7FRUVMWfOHG6++Wa+8pWvUFNTM2DH\nVSAPkNdeew23283KlSt59tlneeyxx6wuyZY8Hg+PPvookZGRVpdiW2vXrmXDhg288MILLF++nMrK\nSqtLsqV33nmHrq4uXnzxRe655x6eeOIJq0uylWeeeYbvfe97dHR0ALBgwQLmzZvHypUrMU1TJw2H\nndhOP/7xj3nkkUdYvnw5V111Fc8888yAHVuBPEA+/elPc9999wFgmiZOp9Piiuxp4cKFzJ49m9TU\nVKtLsa333nuPvLw87rnnHu6++24uvfRSq0uypczMTLxeLz6fj+bmZlwul9Ul2cro0aNZvHhxz/fb\ntm1j2rRpAMyYMYM1a9ZYVZqtnNhOixYtIj8/HwCv10tERMSAHVu/sQMkJiYGgObmZu69917mzZtn\ncUX28/LLL5OUlMT06dN5+umnrS7Hturr6zlw4ABLly5l//79zJ07lzfffBPDMKwuzVaio6MpLy/n\nmmuuob6+nqVLl1pdkq3MnDmT/fv393xvmmbP71BMTAxNTU1WlWYrJ7bTkZOF9evXs2LFCp5//vkB\nO7bOkAdQRUUFt9xyC5/5zGe4/vrrrS7Hdl566SXWrFnDzTffTFFREQ899BDV1dVWl2U7brebiy++\nmPDwcLKysoiIiKCurs7qsmxn2bJlXHzxxfzjH//g1Vdf5eGHH+7pdpSTORxH3/5bWlqIj4+3sBp7\ne/3115k/fz5PP/00SUlJA3YcBfIAqamp4Y477uBb3/oWs2bNsrocW3r++edZsWIFy5cvJz8/n4UL\nF5KSkmJ1WbYzZcoU3n33XUzTpKqqira2Ntxut9Vl2U58fDxxcXEAJCQk0NXVhdfrtbgq+yooKGDt\n2rUArF69mqlTp1pckT29+uqrPe9To0aNGtBjqct6gCxdupRDhw6xZMkSlixZAnQPFtDgJTlTl112\nGR9//DGzZs3CNE0effRRjUk4hdtuu43vfOc7zJkzB4/Hw/333090dLTVZdnWQw89xCOPPMKiRYvI\nyspi5syZVpdkO16vlx//+MekpaXxjW98A4DzzjuPe++9d0COp9WeREREbEBd1iIiIjagQBYREbEB\nBbKIiIgNKJBFRERsQIEsIiJiAwpkERERG1Agi4iI2IACWURExAb+Px5MrgKqDkxXAAAAAElFTkSu\nQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xba54748>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_learning_curve(X_poly, y, Xval_poly, yval, l=0)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "你可以看到训练的代价太低了，不真实. 这是 **过拟合**了"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# try $\\lambda=1$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nSUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xba546d8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_learning_curve(X_poly, y, Xval_poly, yval, l=1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "训练代价增加了些，不再是0了。\n",
    "也就是说我们减轻**过拟合**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# try $\\lambda=100$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nPnz4IEk6fPiwysvL1dHRIcuyWDR88uU81dXVqbq6Wq2trSooKFBLS4ttY1PINlm9erV27twpSbIs\nSx6Px+FEZqqvr1dxcbFmzZrldBRj3bhxQzk5OSotLdW2bdu0cuVKpyMZaf78+YpEIopGowoGg/J6\nvU5HMsrcuXN17Nix8fOHDx9q2bJlkqTly5eru7vbqWhG+XKeGhoalJubK0mKRCLy+Xy2jc0n1ibJ\nycmSpGAwqLKyMpWXlzucyDznz59XZmam8vPz1dzc7HQcY42MjOj58+dqampSf3+/tm/frkuXLsnl\ncjkdzSh+v1/Pnj3TmjVrNDIyoqamJqcjGaWwsFD9/f3j55ZljX+GkpOT9fbtW6eiGeXLefq8WLhz\n547a2trU3t5u29iskG00MDCgTZs2ad26dVq7dq3TcYxz7tw5dXd3q6SkRL29vaqqqtLQ0JDTsYyT\nkZGhvLw8JSYmKjs7Wz6fT69evXI6lnFOnjypvLw8Xb58WZ2dndq9e/f4bUf8mds98eN/dHRUaWlp\nDqYx28WLF1VbW6vm5mZlZmbaNg6FbJPh4WFt2bJFlZWVKioqcjqOkdrb29XW1qbW1lbl5uaqvr5e\nWVlZTscyzuLFi3X9+nVZlqXBwUG9f/9eGRkZTscyTlpamlJTUyVJ6enpCofDikQiDqcy14IFC9TT\n0yNJ6urq0pIlSxxOZKbOzs7xn1Nz5syxdSxuWdukqalJb968UWNjoxobGyWNPSzAw0v4b61atUq3\nbt1SUVGRLMtSTU0NzyR8xebNm7Vnzx4FAgGFQiHt2rVLfr/f6VjGqqqqUnV1tRoaGpSdna3CwkKn\nIxknEomorq5Os2fP1o4dOyRJS5cuVVlZmS3j8deeAAAwALesAQAwAIUMAIABKGQAAAxAIQMAYAAK\nGQAAA1DIAAAYgEIGAMAAFDIAAAb4D9YrPczwN4W9AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xbb302b0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_learning_curve(X_poly, y, Xval_poly, yval, l=100)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "太多正则化了.  \n",
    "变成 **欠拟合**状态"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 找到最佳的 $\\lambda$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "l_candidate = [0, 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1, 3, 10]\n",
    "training_cost, cv_cost = [], []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "for l in l_candidate:\n",
    "    res = linear_regression_np(X_poly, y, l)\n",
    "    \n",
    "    tc = cost(res.x, X_poly, y)\n",
    "    cv = cost(res.x, Xval_poly, yval)\n",
    "    \n",
    "    training_cost.append(tc)\n",
    "    cv_cost.append(cv)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nJ+ubN3uTAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xbc4f7f0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(l_candidate, training_cost, label='training')\n",
    "plt.plot(l_candidate, cv_cost, label='cross validation')\n",
    "plt.legend(loc=2)\n",
    "\n",
    "plt.xlabel('lambda')\n",
    "\n",
    "plt.ylabel('cost')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# best cv I got from all those candidates\n",
    "l_candidate[np.argmin(cv_cost)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "test cost(l=0) = 9.799399498688892\n",
      "test cost(l=0.001) = 11.054987989655938\n",
      "test cost(l=0.003) = 11.249198861537238\n",
      "test cost(l=0.01) = 10.879605199670008\n",
      "test cost(l=0.03) = 10.022734920552129\n",
      "test cost(l=0.1) = 8.632060998872074\n",
      "test cost(l=0.3) = 7.336602384055533\n",
      "test cost(l=1) = 7.46630349664086\n",
      "test cost(l=3) = 11.643928200535115\n",
      "test cost(l=10) = 27.715080216719304\n"
     ]
    }
   ],
   "source": [
    "# use test data to compute the cost\n",
    "for l in l_candidate:\n",
    "    theta = linear_regression_np(X_poly, y, l).x\n",
    "    print('test cost(l={}) = {}'.format(l, cost(theta, Xtest_poly, ytest)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "调参后， $\\lambda = 0.3$ 是最优选择，这个时候测试代价最小"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
